/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.trandio.dao;

import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.naming.NamingException;
import org.trandio.model.MedicoVO;
import org.trandio.model.TurnoVO;

import org.trandio.util.ConexionDb;
import org.trandio.util.HibernateUtil;
import org.trandio.util.Utiles;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author root
 */
public class MedicoDAO implements MedicoInterface {

    Session sesion = null;

    @Override
    public List<MedicoVO> consultarMedico(String identificacion, String nombre1, String nombre2, String apellido1, String apellido2, int firstRow, int rowsPerPage, String sortField, boolean sortAscending) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        if (identificacion != null) {
            if (!identificacion.equals("")) {
                condicion = " WHERE tb_medico.numero_identificacion = '" + identificacion + "'";
            }
        }


        if (nombre1 != null && apellido1 != null) {
            if (!nombre1.equals("") && !apellido1.equals("")) {
                condicion = " WHERE tb_medico.nombre1 = '" + nombre1 + "' AND tb_medico.apellido1 = '" + apellido2 + "'";
            }
        }


        List<MedicoVO> listMedicoVO = new ArrayList<MedicoVO>();
        String sql = "SELECT "
                + "tb_medico.id,"
                + "tb_medico.numero_identificacion,"
                + "tb_medico.nombre1,"
                + "tb_medico.nombre2,"
                + "tb_medico.apellido1,"
                + "tb_medico.apellido2,"
                + "tb_especialidad.descripcion"
                + " FROM tb_medico "
                + "INNER JOIN tb_medicoespecialidad ON (tb_medicoespecialidad.id_medico = tb_medico.id)"
                + "INNER JOIN tb_especialidad ON (tb_medicoespecialidad.id_especialidad = tb_especialidad.id)"
                + condicion + " LIMIT " + rowsPerPage + " OFFSET " + firstRow;

        System.out.println("Sql BUSCAR medico: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    MedicoVO medicoVO = new MedicoVO();
                    medicoVO.setId(res.getInt("id"));
                    medicoVO.setIdentificacion(res.getString("numero_identificacion"));
                    medicoVO.setNombre1(res.getString("nombre1"));
                    medicoVO.setNombre2(res.getString("nombre2"));
                    medicoVO.setApellido1(res.getString("apellido1"));
                    medicoVO.setApellido2(res.getString("apellido2"));
                    medicoVO.setEspecialidad(res.getString("descripcion"));
                    listMedicoVO.add(medicoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return listMedicoVO;
    }

    @Override
    public List<MedicoVO> consultarMedico(String identificacion, String nombre, String apellido) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        if (identificacion != null) {
            if (!identificacion.equals("")) {
                condicion = " WHERE tb_medico.numero_identificacion = '" + identificacion + "'";
            }
        }


        if (nombre != null && apellido != null) {
            if (!nombre.equals("") && !apellido.equals("")) {
                condicion = " WHERE tb_medico.nombre1 = '" + nombre + "' AND tb_medico.apellido1 = '" + apellido + "'";
            }
        }


        List<MedicoVO> listMedicoVO = new ArrayList<MedicoVO>();
        String sql = "SELECT "
                + "tb_medico.id,"
                + "tb_medico.numero_identificacion,"
                + "tb_medico.nombre1,"
                + "tb_medico.nombre2,"
                + "tb_medico.apellido1,"
                + "tb_medico.apellido2,"
                + "tb_especialidad.descripcion"
                + " FROM tb_medico "
                + "INNER JOIN tb_medicoespecialidad ON (tb_medicoespecialidad.id_medico = tb_medico.id)"
                + "INNER JOIN tb_especialidad ON (tb_medicoespecialidad.id_especialidad = tb_especialidad.id)"
                + condicion;

        System.out.println("Sql BUSCAR medico: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    MedicoVO medicoVO = new MedicoVO();
                    medicoVO.setId(res.getInt("id"));
                    medicoVO.setIdentificacion(res.getString("numero_identificacion"));
                    medicoVO.setNombre1(res.getString("nombre1"));
                    medicoVO.setNombre2(res.getString("nombre2"));
                    medicoVO.setApellido1(res.getString("apellido1"));
                    medicoVO.setApellido2(res.getString("apellido2"));
                    medicoVO.setEspecialidad(res.getString("descripcion"));
                    medicoVO.setNombre(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    listMedicoVO.add(medicoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return listMedicoVO;
    }

    @Override
    public int count() throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT count(*) FROM tb_medico";

        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet res = stmt.executeQuery();
        if (res.next()) {
            count = res.getInt(1);
        }


        return count;
    }

    @Override
    public int guardarMedico(MedicoVO medicoVO) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        System.out.println("INSERTAR MEDICO");

        String sqlAdiciona = "INSERT INTO tb_medico("
                + "nombre1, nombre2, apellido1, apellido2, numero_identificacion,"
                + "id_tipo_identificacion,numero_registro)"
                + "VALUES (?,?,?,?,?,?,?) RETURNING id;";

        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);

        System.out.println("tIPO IDENTIFICACION: " + medicoVO.getId_tipo_identificacion());


        stmt.setString(1, medicoVO.getNombre1());
        stmt.setString(2, medicoVO.getNombre2());
        stmt.setString(3, medicoVO.getApellido1());
        stmt.setString(4, medicoVO.getApellido2());
        stmt.setString(5, medicoVO.getIdentificacion());
        stmt.setInt(6, medicoVO.getId_tipo_identificacion());
        stmt.setString(7, medicoVO.getRegistro());

        ResultSet rs = stmt.executeQuery();
        rs.next();
        int resp = rs.getInt(1);
        System.out.println("Insert Generar: " + resp);

        rs.close();
        stmt.close();

        String sqlesp = "INSERT INTO tb_medicoespecialidad("
                + "id_medico, id_especialidad)"
                + "VALUES (?,?)";

        PreparedStatement stmt1 = conn.prepareStatement(sqlesp);
        stmt1.setInt(1, resp);
        stmt1.setInt(2, medicoVO.getId_especialidad());
        stmt1.execute();
        stmt1.close();
        if (!conn.isClosed()) {
            conn.close();
        }
        return resp;
    }

    @Override
    public MedicoVO getMedico(int id) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT "
                + "tb_medico.id,"
                + "tb_medico.numero_identificacion,"
                + "tb_medico.id_tipo_identificacion,"
                + "tb_medico.nombre1,"
                + "tb_medico.nombre2,"
                + "tb_medico.apellido1,"
                + "tb_medico.apellido2,"
                + "tb_medico.numero_registro,"
                + "tb_especialidad.id especialidad"
                + " FROM tb_medico "
                + "INNER JOIN tb_medicoespecialidad ON (tb_medicoespecialidad.id_medico = tb_medico.id)"
                + "INNER JOIN tb_especialidad ON (tb_medicoespecialidad.id_especialidad = tb_especialidad.id)"
                + "INNER JOIN tb_tipoidentificacion ON (tb_medico.id_tipo_identificacion = tb_tipoidentificacion.id)"
                + " WHERE tb_medico.id =" + id;

        System.out.println("Sql buacar medico ID: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        MedicoVO medicoVO = new MedicoVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    medicoVO.setId(res.getInt("id"));
                    medicoVO.setIdentificacion(res.getString("numero_identificacion"));
                    medicoVO.setNombre1(res.getString("nombre1"));
                    medicoVO.setNombre2(res.getString("nombre2"));
                    medicoVO.setApellido1(res.getString("apellido1"));
                    medicoVO.setApellido2(res.getString("apellido2"));
                    medicoVO.setRegistro(res.getString("numero_registro"));
                    medicoVO.setId_especialidad(res.getInt("especialidad"));
                    medicoVO.setId_tipo_identificacion(res.getInt("id_tipo_identificacion"));
                    medicoVO.setNombre(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return medicoVO;

    }

    @Override
    public void guardarMedicoEdit(MedicoVO medicoVO) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();


        updateMedicoEspecialidad(medicoVO.getId(), medicoVO.getId_especialidad());


        String sql = "UPDATE tb_medico"
                + " SET nombre1=?, nombre2=?, apellido1=?,"
                + "apellido2=?, numero_identificacion=?,"
                + "id_tipo_identificacion=?,"
                + "numero_registro=?"
                + " WHERE tb_medico.id=" + medicoVO.getId();

        System.out.println("SQL del Update medico=" + sql);


        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setString(1, medicoVO.getNombre1());
        stmt.setString(2, medicoVO.getNombre2());
        stmt.setString(3, medicoVO.getApellido1());
        stmt.setString(4, medicoVO.getApellido2());
        stmt.setString(5, medicoVO.getIdentificacion());
        stmt.setInt(6, medicoVO.getId_tipo_identificacion());
        stmt.setString(7, medicoVO.getRegistro());
        stmt.execute();

        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }

    public void updateMedicoEspecialidad(int medico, int especialidad) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "UPDATE tb_medicoespecialidad"
                + " SET id_especialidad=?"
                + " WHERE tb_medicoespecialidad.id_medico=" + medico;

        System.out.println("SQL del Update especialidad=" + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setInt(1, especialidad);


        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }

    @Override
    public void crearTurno(int id_medico, Date fecha_cita, Date fecha_cita1, String hinicio, String hfinal, int tiempo, int turnos, int id_sede, String Listasemana, String Listafestivo) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sqlAdiciona = "INSERT INTO tb_turnomedico("
                + "id_medico,fecha,hora_inicio,hora_final,tipo_cita,tiempo,turnos,fechaf,id_sede)"
                + "VALUES (?,?,?,?,1,?,?,?,?) RETURNING id;";
        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);

        java.util.Date feccita = fecha_cita;
        java.sql.Date feccitasql = new java.sql.Date(feccita.getTime());
        java.util.Date feccita1 = fecha_cita1;
        java.sql.Date feccitasql1 = new java.sql.Date(feccita1.getTime());

        String[] hini = hinicio.split(" ");
        // String amini = hini[1];
        String[] hminini = hini[0].split(":");
        int hinihora = Integer.parseInt(hminini[0]);
        int hinimin = Integer.parseInt(hminini[1]);
        /*
        if(amini.equals("PM")){
        hinihora = hinihora + 12;
        }
         */

        String[] hfin = hfinal.split(" ");
        //  String amfin = hfin[1];
        String[] hminfin = hfin[0].split(":");
        int hfinhora = Integer.parseInt(hminfin[0]);
        int hfinmin = Integer.parseInt(hminfin[1]);

        /*
        if(amfin.equals("PM")){
        hfinhora = hfinhora + 12;
        }
         */

        java.sql.Time inisql = new java.sql.Time(hinihora, hinimin, 0);
        java.sql.Time finsql = new java.sql.Time(hfinhora, hfinmin, 0);




        stmt.setInt(1, id_medico);
        stmt.setDate(2, feccitasql);
        stmt.setTime(3, inisql);
        stmt.setTime(4, finsql);
        stmt.setInt(5, tiempo);
        stmt.setInt(6, turnos);
        stmt.setDate(7, feccitasql1);
        stmt.setInt(8, id_sede);



        ResultSet rs = stmt.executeQuery();
        rs.next();
        int turno_medico = rs.getInt(1);
        System.out.println("Id Turno: " + turno_medico);
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }

        //obtener las fechas de la agenda

        java.util.Date fcita_i = fecha_cita;
        java.util.Date fcita_f = fecha_cita1;


        int ttiempo = turnos * tiempo;
        System.out.println("Tiempo total=" + ttiempo);
        int thoras = ttiempo / 60;


        List fechas_agenda = new ArrayList();
        

        
        while (fcita_i.compareTo(fcita_f)!=0) {
            
          String  ds =  Utiles.getDiaDeSemana(fcita_i);
          
                SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");            
                String[] ff = formatoDeFecha.format(fcita_i).split("/");  
                String fc = Integer.parseInt(ff[0])+"/"+Integer.parseInt(ff[1])+"/"+Integer.parseInt(ff[2]);
           
          if ((Listasemana.indexOf(ds)!= -1) && !(Listafestivo.indexOf(fc)!= -1))   {  
           
            fechas_agenda.add(fcita_i);
            
          }
          

          fcita_i = Utiles.sumarDiasFecha(fcita_i, 1);
        }    
      
        String  ds =  Utiles.getDiaDeSemana(fcita_f); 
        SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");            
        String[] ff = formatoDeFecha.format(fcita_f).split("/");  
        String fc = Integer.parseInt(ff[0])+"/"+Integer.parseInt(ff[1])+"/"+Integer.parseInt(ff[2]);
        
        
         if ((Listasemana.indexOf(ds)!= -1) && !(Listafestivo.indexOf(fc)!= -1))   { 
           
            fechas_agenda.add(fcita_f);
            
        }
        
       
        

        for (Object object : fechas_agenda) {
            
            int mintemp = Integer.parseInt(hminini[1]);
            int horatemp = Integer.parseInt(hminini[0]);
            
             hinihora = Integer.parseInt(hminini[0]);        
             hinimin = Integer.parseInt(hminini[1]);       

      
            hfinhora = Integer.parseInt(hminfin[0]);
            hfinmin = Integer.parseInt(hminfin[1]);
            
            
            
            java.util.Date fecha_turno = (java.util.Date) object;


            for (int i = 0; i < turnos; i++) {

                mintemp = hinimin;
                horatemp = hinihora;

                mintemp = mintemp + tiempo;

                if (mintemp > 60) {
                    horatemp++;
                    mintemp = mintemp - 60;
                }

                System.out.println(hinihora + ":" + hinimin + " - " + horatemp + ":" + mintemp);

                crearDetalleTurno(turno_medico, fecha_turno, hinihora, hinimin, horatemp, mintemp);

                hinihora = horatemp;
                hinimin = mintemp;

            }

        }







        /*
        for(int i = 0; i<=thoras-1; i++){
        int mintemp = hinimin;
        int horatemp = hinihora;
        for(int j = 0; j<60/tiempo;j++){
        mintemp = mintemp + tiempo;
        
        if(mintemp==60){
        mintemp = 0;
        horatemp = horatemp + 1;
        }
        System.out.println(hinihora+":"+hinimin+" - "+horatemp+":"+mintemp);
        crearDetalleTurno(turno_medico, hinihora, hinimin, horatemp, mintemp);
        hinimin = hinimin + tiempo;
        }
        hinihora++;
        horatemp++;
        hinimin = 0;
        }
         */


        //ttiempo 225
        //turnos 9
        //tiempo 25


        /* for (int i = 0; i < turnos; i++) {
        
        int mintemp = hinimin;
        int horatemp = hinihora;
        
        mintemp = mintemp + tiempo;
        
        if (mintemp > 60) {
        horatemp++;
        mintemp = mintemp - 60;
        }
        
        
        System.out.println(hinihora + ":" + hinimin + " - " + horatemp + ":" + mintemp);
        
        crearDetalleTurno(turno_medico, fecha_cita1, hinihora, hinimin, horatemp, mintemp);
        
        hinihora = horatemp;
        hinimin = mintemp;
        
        }*/

    }

    public void crearDetalleTurno(int id_turnomedico, Date fecha_turno, int hinihora, int hinimin, int hfinhora, int hfinmin) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sqlAdiciona = "INSERT INTO tb_detalleturno("
                + "id_turnomedico,fecha_turno,hora_inicio,hora_final,estado)"
                + "VALUES (?,?,?,?,?)";
        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);

        java.util.Date fec_tur = fecha_turno;
        java.sql.Date fec_tur_sql = new java.sql.Date(fec_tur.getTime());


        java.sql.Time inisql = new java.sql.Time(hinihora, hinimin, 0);
        java.sql.Time finsql = new java.sql.Time(hfinhora, hfinmin, 0);

        stmt.setInt(1, id_turnomedico);
        stmt.setDate(2, fec_tur_sql);
        stmt.setTime(3, inisql);
        stmt.setTime(4, finsql);
        stmt.setString(5, "F");
        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }

    @Override
    public List<TurnoVO> consultarTurnos(int id, int id_sede) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<TurnoVO> listTurnoVO = new ArrayList<TurnoVO>();
        String sql = "SELECT "
                + "tb_turnomedico.id,"
                + "tb_turnomedico.fecha,"
                + "tb_turnomedico.fechaf,"
                + "tb_turnomedico.hora_inicio,"
                + "tb_turnomedico.hora_final,"
                + "tb_turnomedico.tiempo,"
                + "tb_turnomedico.turnos"
                + " FROM tb_turnomedico"
                + " WHERE tb_turnomedico.id_medico = " + id +" AND tb_turnomedico.id_sede="+id_sede ;

        System.out.println("Sql BUSCAR turnos: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoVO turnoVO = new TurnoVO();
                    turnoVO.setId(res.getInt("id"));
                    turnoVO.setFecha(res.getDate("fecha"));
                    turnoVO.setFechaf(res.getDate("fechaf"));
                    turnoVO.setHinicio(res.getString("hora_inicio"));
                    turnoVO.setHfinal(res.getString("hora_final"));
                    turnoVO.setTiempo(res.getInt("tiempo"));
                    turnoVO.setTurnos(res.getInt("turnos"));

                    listTurnoVO.add(turnoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return listTurnoVO;
    }

    @Override
    public void quitarTurno(int id_turno) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "DELETE FROM tb_turnomedico"
                + " WHERE tb_turnomedico.id=" + id_turno;
        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sql);
        stmt.close();

        String sql1 = "DELETE FROM tb_detalleturno"
                + " WHERE tb_detalleturno.id_turnomedico=" + id_turno;
        Statement stmt1 = conn.createStatement();
        stmt1.executeUpdate(sql1);
        stmt1.close();


    }

    @Override
    public List<MedicoVO> consultarMedicoEspecialidad(int id_especialidad) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<MedicoVO> listMedicoVO = new ArrayList<MedicoVO>();
        String sql = "SELECT "
                + "tb_medico.id,"
                + "tb_medico.numero_identificacion,"
                + "tb_medico.nombre1,"
                + "tb_medico.nombre2,"
                + "tb_medico.apellido1,"
                + "tb_medico.apellido2,"
                + "tb_especialidad.descripcion"
                + " FROM tb_medico "
                + "INNER JOIN tb_medicoespecialidad ON (tb_medicoespecialidad.id_medico = tb_medico.id)"
                + "INNER JOIN tb_especialidad ON (tb_medicoespecialidad.id_especialidad = tb_especialidad.id)"
                + " WHERE tb_especialidad.id=" + id_especialidad;

        System.out.println("Sql Buscar Medico por especialidad: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    MedicoVO medicoVO = new MedicoVO();
                    medicoVO.setId(res.getInt("id"));
                    medicoVO.setIdentificacion(res.getString("numero_identificacion"));
                    medicoVO.setNombre1(res.getString("nombre1"));
                    medicoVO.setNombre2(res.getString("nombre2"));
                    medicoVO.setApellido1(res.getString("apellido1"));
                    medicoVO.setApellido2(res.getString("apellido2"));
                    medicoVO.setEspecialidad(res.getString("descripcion"));
                    medicoVO.setNombre(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));

                    listMedicoVO.add(medicoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return listMedicoVO;
    }

    @Override
    public boolean validarTurno(int medico, Date fecha, Date fecha1, String hinicio, String hfin, int sede) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        boolean resp = false;

        String sql = "SELECT count(*) cant"
                + " from tb_turnomedico   "
                + " WHERE  id_sede=" + sede + " AND id_medico=" + medico + " AND ('" + fecha + "' between fecha AND fechaf)"
                + " AND '" + hinicio + "' < hora_final";


        System.out.println("validar_turno: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet res = stmt.executeQuery();
        if (res.next()) {
            count = res.getInt(1);
            if (count > 0) {
                resp = true;
            }
        }


        return resp;
    }

    @Override
    public int validarCita(int turno) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "select count(*) "
                + "from tb_detalleturno"
                + " inner join tb_citamedica on (tb_detalleturno.id=tb_citamedica.id_detalleturno)"
                + " where tb_detalleturno.id_turnomedico = " + turno
                + " and tb_citamedica.estado='T'";

        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet res = stmt.executeQuery();
        if (res.next()) {
            count = res.getInt(1);
        }


        return count;
    }

    @Override
    public int getCantMedicos(String $sWhere) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT count(*) FROM tb_medico";

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return count;
    }

    @Override
    public List<MedicoVO> getMedicos(int displayStart, int displayLength, String $sWhere, String orden) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<MedicoVO> lista = new ArrayList<MedicoVO>();
        String condicion = "";

        if (!$sWhere.equals("")) {
            //condicion = " WHERE tb_factura.numero LIKE '%"+param+"%' ";
            condicion = $sWhere;
        }



        String sql = "SELECT "
                + "tb_medico.id,"
                + "tb_medico.numero_identificacion,"
                + "tb_medico.nombre1,"
                + "tb_medico.nombre2,"
                + "tb_medico.apellido1,"
                + "tb_medico.apellido2"
                + " FROM tb_medico " + condicion + " " + orden + " LIMIT " + displayLength + " OFFSET " + displayStart;


        System.out.println(sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    MedicoVO objVO = new MedicoVO();
                    objVO.setId(res.getInt("id"));
                    objVO.setIdentificacion(res.getString("numero_identificacion"));
                    objVO.setNombre1(res.getString("nombre1"));
                    objVO.setNombre2(res.getString("nombre2"));
                    objVO.setApellido1(res.getString("apellido1"));
                    objVO.setApellido2(res.getString("apellido2"));
                    lista.add(objVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return lista;
    }

    @Override
    public List traerTurnos(int idPaciente) {
        sesion = HibernateUtil.getSessionFactory().openSession();

        Query q;

        q = sesion.createSQLQuery("SELECT "
                + "tb_turnomedico.id_medico, "
                + "tb_turnomedico.fecha, "
                + "tb_especialidad.descripcion, "
                + "tb_especialidad.id esp, "
                + "tb_detalleturno.hora_inicio, "
                + "tb_detalleturno.hora_final,"
                + "tb_detalleturno.id,"
                + "tb_citamedica.id cita"
                + " FROM "
                + "tb_citamedica, "
                + "tb_detalleturno, "
                + "tb_turnomedico, "
                + "tb_medicoespecialidad, "
                + "tb_especialidad"
                + " WHERE "
                + "tb_citamedica.id_detalleturno = tb_detalleturno.id AND "
                + "tb_detalleturno.id_turnomedico = tb_turnomedico.id AND "
                + "tb_turnomedico.id_medico = tb_medicoespecialidad.id_medico AND "
                + "tb_medicoespecialidad.id_especialidad = tb_especialidad.id AND "
                + "tb_citamedica.id_paciente = ? AND tb_citamedica.facturado='F' AND "
                + "tb_citamedica.estado='T'").addScalar("id_medico", Hibernate.INTEGER).addScalar("fecha", Hibernate.STRING).addScalar("descripcion", Hibernate.STRING).addScalar("esp", Hibernate.STRING).addScalar("hora_inicio", Hibernate.STRING).addScalar("hora_final", Hibernate.STRING).addScalar("id", Hibernate.INTEGER).addScalar("cita", Hibernate.INTEGER).setInteger(0, idPaciente);

        return q.list();

    }
}